
import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'
// create an axios instance
const service = axios.create({
  // VUE_APP_BASE_API这个变量是声明在.env.development文件中的一个变量
  baseURL: process.env.VUE_APP_BASE_API, // 请求基地址
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 1000 // 请求超时时间
})
const time = 24 * 60 * 60 * 1000// 设置token有效时长
// 请求拦截器
service.interceptors.request.use((config) => {
  // 统一设置token
  const token = store.state.user.token
  if (token) {
    // token过期处理
    const curTime = Date.now()// 当前时间戳
    // 登录的时间戳
    const loginTime = localStorage.getItem('loginTime')
    // 当两个时间戳相减得到的时间差 大于 规定的token有效
    // 时长的时候，表示此刻登录超时了
    if (curTime - loginTime > time) {
      // 超时了
      store.dispatch('user/logout')
      // 跳转到登录页面
      router.push('/login')
      // 返回一个错误信息，阻止请求的继续执行
      return Promise.reject(new Error('登录超时，请重新登录---前端超时处理'))
    }
    // 注意：Bearer和token之间一定要有空格
    config.headers.Authorization = `Bearer ${token}`
  }
  return config// 放行
})

// 响应拦截器
service.interceptors.response.use((response) => {
  // console.log(16, response)
  const { success, message, data } = response.data
  if (success) {
    // 成功
    return data
  } else {
    // 失败
    Message.error(message)
    // 返回一个错误信息，这样结合async和await可以阻止页面跳转
    // Promise.reject返回一个错误状态的promise实例对象
    // 这个方法是es6提供的
    // new Error--原生js（es5）提供的方法，用于实例化一个错误对象
    // new Error结合Promise.reject使用，可以将错误信息的位置也输出到控制台中
    return Promise.reject(new Error(message))
  }
  // return response.data.data// 放行
},
(error) => {
  // 网络层面失败 -- 触发这个函数
  // 比如：请求超时的时候，就会出现网络层面失败
  // console.log('网络层面失败', error)
  // console.dir(error)
  if (error.response && error.response.data.code === 10002) {
    // 当后端返回code值为10002的时候表示 token失效了
    // 清除token（直接调用退出登录函数即可）
    store.dispatch('user/logout')
    // 跳转到登录页面
    router.push('/login')
    Message.error('登录超时，请重新登录！---后端设置过期时间')
  } else {
    // 其他错误的提示
    Message.error(error.message)
  }

  return Promise.reject(error)
}
)

export default service
